#include <vcl.h>
#include <Dir.h> //Pour la constante MAXPATH
#pragma hdrstop

#include <Eic.h>
#include "MTAG_Outils.h"
#include "CCarnAdrBR.h"
#include "uFileOp.h" //Pour la fonction EicFileDirDelete
#include "uParamCourrierEtCarnAdr.h" //Pour GetRepsCourrier

#pragma package(smart_init)

#define MODULE_TAG MTAG_CCARNADRBR

//---------------------------------------------------------------------------
// ValidCtrCheck est utilisé est utilisé pour être sûr que les composants créés n'ont
// aucune fonction virtuelle pure.
//

static inline void ValidCtrCheck(CCarnAdrBR *)
{
   new CCarnAdrBR(NULL);
}
//---------------------------------------------------------------------------
__fastcall CCarnAdrBR::CCarnAdrBR(TComponent* Owner)
   : TComponent(Owner)
{
try
   {
   hCarnAdr = NULL;
   _Sauver = NULL;
   _RafraichirRepDatas = NULL;
   }
catch(Exception &e)
   {
   EICDisplayException(TAG(0), e);
   }
}
//---------------------------------------------------------------------------
__fastcall CCarnAdrBR::~CCarnAdrBR()
{
try
   {
   if (!aBRRepDecomp.IsEmpty()) //Si la décompression a été effectuée
      Effacer();

   ::FreeLibrary(hCarnAdr);        hCarnAdr = NULL;
   }
catch(Exception &e)
   {
   EICDisplayException(TAG(999), e);
   }
}

/*******************************************************************************

Fonction :

P.E :

P.E modifiés :

P.S :
*******************************************************************************/
bool __fastcall CCarnAdrBR::Sauver()
{
  AnsiString /*aFichierCible, */aRepDll = "";
  bool bSauver = false;
  try
     {
     if (!hCarnAdr)
       {
       GetRepsCarnAdr(&aRepDll, NULL);
       aRepDll +="CarnAdr.dll";
       hCarnAdr = LoadLibrary (aRepDll.c_str());
       if (!hCarnAdr)
          throw EAbort("Impossible de charger "+ aRepDll);
       }

    if (!_Sauver)
       {
       _Sauver = (FctSauverCarnAdr) GetProcAddress(hCarnAdr, "_SauvegarderCarnAdr");
       if (!_Sauver)
          throw EAbort("Impossible de charger la fonction _SauvegarderCarnAdr");
       }

    ASSERT(!m_aRepTravail.IsEmpty() && !m_aNomFichier.IsEmpty());
    bSauver = _Sauver(m_aRepTravail + m_aNomFichier, m_aRepTmp, FOnInsertFloppy, FOnIncrementation);
  }
  catch(Exception &e)
  {
    EICDisplayException(TAG(10), e);
  }
  return bSauver;
}

//---------------------------------------------------------------------------
bool __fastcall CCarnAdrBR::Decompresser()
{
char szTempPath[MAXPATH];
AnsiString aRepDll = "";
bool bDecompresser = false;
try
   {
   if (!hCarnAdr)
     {
     GetRepsCarnAdr(&aRepDll, NULL);
     aRepDll +="CarnAdr.dll";
     hCarnAdr = LoadLibrary (aRepDll.c_str());
     if (!hCarnAdr)
        throw EAbort("Impossible de charger "+ aRepDll);
     }
    if (!_Decompresser)
    {
      _Decompresser = (FctDecompresserCarnAdr) GetProcAddress(hCarnAdr, "_DecompresserCarnAdr");
      if (!_Decompresser)
        throw EAbort("Impossible de charger la fonction _DecompresserCarnAdr");
    }

   if (m_aRepTmp.IsEmpty())
      {
      GetTempPath(MAX_PATH, szTempPath);
      aBRRepDecomp = AnsiString(szTempPath);
      }
   else
      aBRRepDecomp = m_aRepTmp;
    aBRRepDecomp += NOM_REP_TEMP_CARNADR"\\";

    bDecompresser = _Decompresser(m_aRepTravail + m_aNomFichier, aBRRepDecomp, FOnInsertFloppy, FOnIncrementation);
   }
catch(Exception &e)
   {
   EICDisplayException(TAG(20), e);
   }
return bDecompresser;
}
//---------------------------------------------------------------------------
bool __fastcall CCarnAdrBR::Restaurer(unsigned long *NoFiche,
                                      eTypeRestauration eModeRestauration)
{
  bool bRestaurer = false;
  try
  {
  //La fonction Decompresser doit obligatoirement avoir été appelé avant
  //hCarnAdr doit donc être initialisé.
  ASSERT(hCarnAdr);

    if (!_RestaurerFiche)
    {
      _RestaurerFiche = (TFctRestaurerFiche) GetProcAddress(hCarnAdr, "_RestaurerFiche");
      if (!_RestaurerFiche)
        throw EAbort("Impossible de charger la fonction _RestaurerFiche");
    }
    bRestaurer = _RestaurerFiche(aBRRepDecomp, NoFiche, eModeRestauration);
  }
  catch(Exception &e)
  {
    EICDisplayException(TAG(30), e);
  }
  return bRestaurer;
}
//---------------------------------------------------------------------------
bool __fastcall CCarnAdrBR::Effacer()
{
bool bEffacer = false;
try
   {
   if (aBRRepDecomp.IsEmpty()) //Si la décompression n'a pas été effectuée
      return true;

   //On ne peut pas effacer le répertoire en raison du bug suivant :
   //Lorsqu'une table contenant des indexes secondaires est ouverte, son répertoire ne peut
   //être supprimé (même après suppression du contenu) jusqu'à la fermeture de l'application.
   bEffacer = EicDirDeleteContenu(aBRRepDecomp, NULL, true);
   }
catch(Exception &e)
   {
   EICDisplayException(TAG(40), e);
   }
return bEffacer;
}

/*******************************************************************************
void __fastcall  SetRepTemp (AnsiString aRep)

Fonction :

P.E :

P.E modifiés :

P.S :
*******************************************************************************/
void __fastcall  CCarnAdrBR::SetRepTemp (AnsiString aRep)
{
try
   {
   m_aRepTmp = aRep;
   if (m_aRepTmp.LastDelimiter("\\") != m_aRepTmp.Length())
      m_aRepTmp += "\\";
   }
catch(Exception &e)
   {
   EICDisplayException(TAG(50), e);
   }
}

/*******************************************************************************
void __fastcall SetRepTrav (AnsiString aRep)

Fonction :

P.E :

P.E modifiés :

P.S :
*******************************************************************************/
void __fastcall CCarnAdrBR::SetRepTrav (AnsiString aRep)
{
try
   {
   m_aRepTravail = aRep;
   if (m_aRepTravail.LastDelimiter("\\") != m_aRepTravail.Length())
      m_aRepTravail += "\\";
   }
catch(Exception &e)
   {
   EICDisplayException(TAG(60), e);
   }
}

/*******************************************************************************
bool __fastcall RafraichirRepDatas()

Fonction : Cette fonction doit être appelé lorsque le répertoire "Datas" du carnet
           d'adresse vient d'être changé dans la base de registre ou dans dll_ext.ini

           A consommer avec MODERATION !
*******************************************************************************/
bool __fastcall CCarnAdrBR::RafraichirRepDatas()
{
try
  {
  if (!hCarnAdr)
    {
    AnsiString aRepDll;
    GetRepsCarnAdr(&aRepDll, NULL);
    aRepDll +="CarnAdr.dll";
    hCarnAdr = LoadLibrary (aRepDll.c_str());
    if (!hCarnAdr)
       throw EAbort("Impossible de charger "+ aRepDll);
    }

  if (!_RafraichirRepDatas)
     {
     _RafraichirRepDatas = (FctRafraichirRepDatasCarnAdr) GetProcAddress(hCarnAdr, "_RafraichirRepDatasCarnAdr");
     if (!_RafraichirRepDatas)
       throw EAbort("Impossible de charger la fonction _RafraichirRepDatasCarnAdr");
     }

  return _RafraichirRepDatas();
  }
  catch(Exception &e)
  {
  EICDisplayException(TAG(70), e);
  return false;
  }
}

namespace Ccarnadrbr
{
   void __fastcall PACKAGE Register()
   {
       TComponentClass classes[1] = {__classid(CCarnAdrBR)};
       RegisterComponents("EIC Outils", classes, 0);
   }
}
//---------------------------------------------------------------------------
